package com.qingxin.sys.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.util.JxlsHelper;

/**
 * 按模板导出Excel工具<br/>
 * 依赖jar包：
 * commons-collections4-4.1.jar
 * commons-jexl-2.0.1.jar
 * jxls-2.4.3.jar
 * jxls-poi-1.0.14.jar
 * poi-3.17.jar
 * poi-ooxml-3.17.jar
 * poi-ooxml-schemas-3.17.jar
 * xmlbeans-2.6.0.jar
 * 
 * @author Administrator
 *
 */
public class ExcelUtil {
	

	/**
	 * 按模板导出Excel
	 * @param templateStream 模板
	 * @param targetStream 输出
	 * @param data 数据，在模板中用变量data引用
	 * @throws IOException
	 */
	public static void exportExcel(InputStream templateStream, OutputStream targetStream, Object data) throws IOException{
		JxlsHelper jxlsHelper = JxlsHelper.getInstance();
		Transformer transformer = jxlsHelper.createTransformer(templateStream, targetStream);
		
		JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();
		Map<String, Object> funcs = new HashMap<String, Object>();
		funcs.put("utils", new ExcelUtil()); //添加自定义功能
		evaluator.getJexlEngine().setFunctions(funcs);
		
		Context context = new Context();
		context.putVar("data", data);
		
		jxlsHelper.processTemplate(context, transformer);
		templateStream.close();//关闭模板输入
	}
	
	
	/**
	 * 按模板导出Excel
	 * @param templateFile
	 * @param targetStream
	 * @param data
	 * @throws IOException
	 */
	public static void exportExcel(File templateFile, OutputStream targetStream, Object data) throws IOException{
		exportExcel(new FileInputStream(templateFile), targetStream, data);
	}
	
	
	/**
	 * 按模板导出Excel
	 * @param templateFile 模板
	 * @param targetFile 输出
	 * @param data 数据，在模板中用变量data引用
	 * @throws IOException
	 */
	public static void exportExcel(File templateFile, File targetFile, Object data) throws IOException{
		if(!targetFile.getParentFile().exists()){
			targetFile.getParentFile().mkdirs();
		}
		OutputStream targetStream = new FileOutputStream(targetFile);
		exportExcel(new FileInputStream(templateFile), targetStream, data);
		targetStream.close();
	}
	
	
	/**
	 * 按模板导出Excel
	 * @param templateStream 模板
	 * @param data 数据，在模板中用变量data引用
	 * @return
	 */
	public static byte[] exportExcelToBytes(InputStream templateStream, Object data){
		try {
			ByteArrayOutputStream targetStream = new ByteArrayOutputStream();
			exportExcel(templateStream, targetStream, data);
			return targetStream.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	/**
	 * 按模板导出Excel
	 * @param templateStream 模板
	 * @param data 数据，在模板中用变量data引用
	 * @return
	 */
	public static ByteArrayInputStream exportExcelToByteArray(InputStream templateStream, Object data){
		byte[] bytes = exportExcelToBytes(templateStream, data);
		if(bytes != null){
			return new ByteArrayInputStream(bytes);
		}
		return null;
	}
	
	
	/**
	 * 格式化日期输出
	 * @param date
	 * @param fmt
	 * @return
	 */
	public String dateFmt(Date date, String fmt) {
		if(date == null) {
			return "";
		}
		try {
			SimpleDateFormat dateFmt = new SimpleDateFormat(fmt);
			return dateFmt.format(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
	
	
	/**
	 * 从Map中选值
	 * @param val
	 * @param mapData
	 * @return
	 */
	public String map(Object val, String mapData){
		if(val == null){
			return "";
		}
		if(mapData == null || mapData.length()<2){
			return val.toString();
		}
		String[] items = mapData.split(",");
		for(String item : items){
			String[] arr = item.split(":");
			if(val.toString().equals(arr[0])){
				return arr[1];
			}
		}
		return "";
	}
	
}
